﻿using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using Microsoft.Ajax.Utilities;

public class Minify
{
    #region Static
    /// <summary>
    /// Neues Minify Objekt zurückgeben, welches dann JavaScript oder Css Minifien kann.
    /// </summary>
    /// <param name="debug">Gibt an ob alles Minified werden soll oder nicht, wenn debuggt werden soll.</param>
    public static Minify Min(bool debug)
    {
        return new Minify(debug);
    }
    #endregion

    #region Konstruktor
    private Minify(bool debug)
    {
    }
    #endregion

    #region Member
    /// <summary>
    /// Gibt an ob die Daten Minified werden sollen oder ob diese zum Debuggen normal ausgegeben werden sollen.
    /// </summary>
    public bool Debug { get; set; }
    #endregion

    #region Public Functions
    /// <summary>
    /// CSS Datei Minimieren
    /// </summary>
    /// <param name="fileName">Relativer Pfad vom Webverzeichnis aus zur Datei die Minimiert werden soll</param>
    /// <returns>Minified Stylesheet in einem Style Tag</returns>
    public MvcHtmlString Css(string fileName)
    {
        //Den Pfad heraussuchen in dem die Style Datei gefunden werden kann.
        string path = Path.Combine(HttpContext.Current.Server.MapPath(@"~/"), fileName);
        if (File.Exists(path))
        {
            //Den Style auslesen aus der Original Datei.
            string style = File.ReadAllText(path);
            if (!Debug)
            {
                //Den AjaxMinifier nutzen um die Daten zu "verkleinern"
                Minifier minifier = new Minifier();
                style = minifier.MinifyStyleSheet(style);
            }

            //Das ganze in Style Tags packen und dann zurückgeben
            return new MvcHtmlString(string.Format("<style>{0}</style>", style));
        }

        return new MvcHtmlString(string.Empty);
    }

    /// <summary>
    /// JavaScript Datei Minimieren.
    /// </summary>
    /// <param name="fileName">Relativer Pfad vom Webverzeichnis aus zur Datei die Minimiert werden soll</param>
    /// <returns>Minified JavaScript in einem Script Tag</returns>
    public MvcHtmlString JavaScript(string fileName)
    {
        //Den Pfad heraussuchen in dem die Style Datei gefunden werden kann.
        string path = Path.Combine(HttpContext.Current.Server.MapPath(@"~/"), fileName);
        if (File.Exists(path))
        {
            //Den Style auslesen aus der Original Datei.
            string script = File.ReadAllText(path);
            if (!Debug)
            {
                //Den AjaxMinifier nutzen um die Daten zu "verkleinern"
                Minifier minifier = new Minifier();
                script = minifier.MinifyJavaScript(script);
            }

            //Das ganze in Style Tags packen und dann zurückgeben
            return new MvcHtmlString(string.Format("<script>{0}</script>", script));
        }

        return new MvcHtmlString(string.Empty);
    }
    #endregion
}
